# -*- coding: utf-8 -*-

"""
 *
 * - Ime
 *
 *  - kratki opis
 *
 * Autori: Koki007
 * Verzija: 0.1
 * Datum: 22.01.2011
 *
"""

import pygame
from pygame.locals import *

# klasa odgovorna za fizicki izgled i smjestaj GUI elementa
# sadrzi atribute koji odreduju izgled GUI elementa, ujedno i crta/vizualno kreira taj element
class cGUI_atributi(object):

    def __init__(self, pozicija_x, pozicija_y, duzina_x, duzina_y, pozadina_boja, transparentna_boja, font_velicina, font_boja,  tekst , tekst_x, tekst_y, zvuk_klik, zvuk_na_kursoru):
        self.pozicija_x = pozicija_x 
        self.pozicija_y = pozicija_y
        #self.pozicija_tip = "kut" # kut / centar?
        self.duzina_x = duzina_x  # int / auto?
        self.duzina_y = duzina_y
        self.pozadina_boja = pozadina_boja 
        #self.pozadina_slika = 0
        self.transparentna_boja = transparentna_boja
        #self.font_tip = ""
        self.font_velicina = font_velicina
        self.font_boja = font_boja
        self.tekst = tekst
        self.tekst_x = 5
        self.tekst_y = 5
        self.surface = 0
        
        # TODO: zvukove izbaciti iz atributa i staviti u cGUI_element
        self.zvuk_na_kursoru = zvuk_na_kursoru # ako mozda nije ocito, zvuk koji ce GUI_element ispustiti kad se preko njega prede misem
        self.zvuk_klik = zvuk_klik # ova i varijabla iznad kod loadiranja sadrze ime datoteke za zvuk, nakon azuriranje u te iste varijable se stavi pygame zvucni objekt za te zvucne datoteke
        
        self.azuriraj()
        pass
    
    # iliti azuriraj sliku elementa - potrebno zvati nakon promjene nekog atributa ako se zeli da se to i vidi
    def azuriraj(self):
        self.surface = pygame.Surface((self.duzina_x, self.duzina_y))
        self.surface.fill(self.pozadina_boja)
        font = pygame.font.Font( None, self.font_velicina)
        tekst = font.render(self.tekst, 0, self.font_boja)
        self.surface.blit(tekst, (self.tekst_x, self.tekst_y) )
        self.surface.set_colorkey(self.transparentna_boja)
        if self.zvuk_na_kursoru:
            self.zvuk_na_kursoru = pygame.mixer.Sound(self.zvuk_na_kursoru)
        if self.zvuk_klik:
            self.zvuk_klik = pygame.mixer.Sound(self.zvuk_klik)
       
        
    def get_rect(self):
        return self.surface.get_rect( left = self.pozicija_x, top = self.pozicija_y )
        
    def crtaj(self, surface_cilj):
        surface_cilj.blit(self.surface, (self.pozicija_x, self.pozicija_y) )
        
        
# dodaje elementima definiranima po GUI atribut klasi konkretno ponasanje. Detektiranje input i obavljanje radnje na temelju toga
class cGUI_element(object):

    def __init__(self, pozicija_x, pozicija_y, duzina_x, duzina_y, pozadina_boja = (0, 150, 0), transparentna_boja = (0, 0, 0), font_velicina = 28, font_boja = (255,255,255),  tekst = "", tekst_x = 0, tekst_y = 0, zvuk_klik = None, zvuk_na_kursoru = None):
        # standardni iliti default atributi, kad element nije u nikvom "stanju"
        self.atributi_standardni = cGUI_atributi(pozicija_x, pozicija_y, duzina_x, duzina_y, pozadina_boja, transparentna_boja, font_velicina, font_boja,  tekst , tekst_x, tekst_y, zvuk_klik, zvuk_na_kursoru)

        self.atributi_na_kursoru = 0 #atributi za element kada je kursor iznad njega
        self.atributi_neaktivan = 0 #atributi za element kada je neaktivan iliti disabled
        
        # pointer na atribute koji se trenutno crtaju/koriste
        self.atributi_aktivni = self.atributi_standardni
        
        #zastave koje prate stanja elemenata
        self.aktivan = 1
        
        # sadrzi listu funkcija i argumentata koji se pozivaju kod klika
        # index oznacava koji gumb je kliknuti (1,2,3..) prema izlazu pygame event objekta, podatak u indeksu je [funkcija, *args]
        self.na_klik_lista = [ [0,0], [0,0], [0,0], [0,0], [0,0], [0,0]]
        pass
        
        
    def primi_event(self, event):
        if self.aktivan:
            if event.type == MOUSEMOTION:
                # provjera je li krusor iznad elementa
                #mis_x, mis_y = event.pos
                if self.atributi_aktivni.get_rect().collidepoint( event.pos ):
                    if self.atributi_na_kursoru:
                        if id(self.atributi_aktivni) != id(self.atributi_na_kursoru):
                            if self.atributi_aktivni.zvuk_na_kursoru: self.atributi_aktivni.zvuk_na_kursoru.play()
                        self.atributi_aktivni = self.atributi_na_kursoru
                    
                # ako kursor nije iznad elementa
                else: self.atributi_aktivni = self.atributi_standardni
            
            
            # ako je kursor iznad elementa i kliknuto je na njega poziva funkciju sa argumenitma prema listi "self.na_klik"
            if event.type == MOUSEBUTTONDOWN:
                if self.atributi_aktivni.get_rect().collidepoint( event.pos ):
                    if self.atributi_aktivni.zvuk_klik: self.atributi_aktivni.zvuk_klik.play()
                    gumb = event.button
                    funkcija = self.na_klik_lista[gumb][0]
                    argumenti = self.na_klik_lista[gumb][1]
                    if funkcija:
                        funkcija(*argumenti)
                        pass
        pass
        
        
    def azuriraj(self):
        pass
        
        
    def crtaj(self, glavni_buffer):
        self.atributi_aktivni.crtaj(glavni_buffer)
        pass
        
    # dodaje u listu koju funkciju i argumente treba pozlavti za klik na elemnt s odredenim gumbom
    def na_klik(self, gumb, funkcija, *args):
        if gumb == "lijevi": #1
            self.na_klik_lista[1] = [funkcija, args]
  
        if gumb == "srednji": #2
            self.na_klik_lista[2] = [funkcija, args]
            
        if gumb == "desni": #3
            self.na_klik_lista[3] = [funkcija, args]
            
        if gumb == "kotacic_gore": #4
            self.na_klik_lista[4] = [funkcija, args]
            
        if gumb == "kotacic_dolje": #5
            self.na_klik_lista[5] = [funkcija, args]
        pass
        
    
    # postavlja atribute za neko stanje
    def postavi_atribute(self, stanje, pozadina_boja = (0, 150, 0), transparentna_boja = (0, 0, 0), font_velicina = 28, font_boja = (255,255,255),  tekst = "", tekst_x = 0, tekst_y = 0, zvuk_klik = None, zvuk_na_kursoru = None):
        atributi = cGUI_atributi(self.atributi_standardni.pozicija_x, self.atributi_standardni.pozicija_y, self.atributi_standardni.duzina_x, self.atributi_standardni.duzina_y, pozadina_boja, transparentna_boja, font_velicina, font_boja,  tekst , tekst_x, tekst_y, zvuk_klik, zvuk_na_kursoru)
        if stanje == "standardni":
            self.atributi_standardni = atributi
        
        elif stanje == "na_kursoru":
            self.atributi_na_kursoru = atributi
            
        elif stanje == "neaktivan":
            self.atributi_neaktivan = atributi
            
        else:
            "--> GUI GRESKA: Nepoznati stanje atributa cGUI_element.postavi_atribute(stanje)"
            raise
            
    # promijeni neki atribut za neko ili sva stanja
    # TODO: za sada mijenja samo tekst, kad se sredi cijela klasa kako spada dodat ce se i ostalo
    def promijeni_atribute(self, stanje = None, tekst = None):
    
        # PRIVREMENO, mora se bolje napraviti jer inace vodi u spagete-kod
        # najbolje da se stanja postave u dict koji ce drzati instance attribut klasa
        if stanje == "standardni":
            if tekst != None:
                self.atributi_standardni.tekst = tekst
                self.atributi_standardni.azuriraj()
        
        elif stanje == "na_kursoru":
            if tekst != None:
                self.atributi_na_kursoru.tekst = tekst
                self.atributi_na_kursoru.azuriraj()
            
        elif stanje == "neaktivan":
            if tekst != None: 
                self.atributi_neaktivan.tekst = tekst
                self.atributi_neaktivan.azuriraj()
            
        elif stanje == None:
            if tekst != None and self.atributi_standardni: 
                self.atributi_standardni.tekst = tekst
                self.atributi_standardni.azuriraj()
                
            if tekst != None and self.atributi_na_kursoru:
                self.atributi_na_kursoru.tekst = tekst
                self.atributi_na_kursoru.azuriraj()
                
            if tekst != None and self.atributi_neaktivan:
                self.atributi_neaktivan.tekst = tekst
                self.atributi_neaktivan.azuriraj()

            
        else:
            "--> GUI GRESKA: Nepoznati stanje atributa cGUI_element.postavi_atribute(stanje)"
            #raise
        pass
            
    def aktiviraj(self):
        self.aktivan = True
        self.atributi_aktivni = self.atributi_standardni
        pass
        
    def deaktiviraj(self):
        self.aktivan = False
        if self.atributi_neaktivan:
            self.atributi_aktivni = self.atributi_neaktivan


# "skladiste" GUI elementima, pomocu nje se dodaju, brisu i referenciraju GUI elementi
class cGUI_upravitelj:

    def __init__(self):
        self.lista_elementa = {}
        pass
        
        
    def primi_event(self, event):
        for element in self.lista_elementa:
            self.lista_elementa[element].primi_event(event)
        pass
        
        
    def azuriraj(self):
        for element in self.lista_elementa:
            self.lista_elementa[element].azuriraj()
        pass
        
        
    def crtaj(self, glavni_buffer):
        for element in self.lista_elementa:
            self.lista_elementa[element].crtaj(glavni_buffer)
        pass
    
    
    def dodaj_element(self, ime, element):
        self.lista_elementa[ime] = element
        return element
        
        
    def izbrisi_element(self, ime):
        del self.lista_elementa[ime]

     
    def element(self, ime):
        return self.lista_elementa[ime]
